home *** CD-ROM | disk | FTP | other *** search
/ Amoszine 7 / Amoszine 7 (Disk 1 of 3).adf / ARTS / MA_POWER_BOBS_DOC.asc.cm / MA_POWER_BOBS_DOC.asc.cm
Text File  |  1995-06-03  |  34KB  |  1,042 lines

  1.                   E0P3 Power Bobs doc file. (18/05/1995) V1.0P1
  2.                      P3               byP1
  3.                      P3           Manuel Andre              P1E3
  4.  
  5.  
  6. P5
  7. We were hoping to give you a Shareware version of Powerbobs to try out. But the
  8. late post between England to Belgium, only allows us to show you this document.
  9.  
  10. The extension itself will be on the next issue of the Amoszine, it already has
  11. some new features, which are not listed here.
  12. P1
  13.  
  14.  
  15. For those of you who can't wait, you can try out the shareware version of
  16. Powerbobs by sending a 
  17.                         SAE & disk to:- 
  18.                                         P3POWERBOBS
  19.                                         27 BARTON ROAD
  20.                                         MAIDSTONE
  21.                                         KENT
  22.                                         ME15 7BU
  23.                                         ENGLANDP1
  24.  
  25. P3What is this anyway?
  26. ====================
  27. P1
  28. A HIGH-speed AMOS/Pro extension, adding numerous new commands to give your
  29. work the extra speed AMOS/Pro lacks.
  30. It is in fact a welcome addition to the AMOS/Pro Turbo Plus extension, also
  31. written by me.
  32.  
  33. Included are :
  34.  Pbobs replacing the entire AMOS/Pro Bob system.
  35.  Psprites replacing the entire AMOS/Pro Sprite system.
  36.  Pbob and Psprite Amal support.
  37.  New Amal command allowing all 64 channels to run under interrupts!
  38.  Superfast collision detection for each type of object using coordinate
  39.  checking.
  40.  Various commands allowing arithmetics on entire arrays (a lot faster).
  41.  Probably some BUGS... :-)
  42.  
  43. Excluded are :
  44.  All commands/functions you failed to mention. ;-)
  45.  
  46.  
  47.  
  48.  
  49. P3Why SHAREWARE?
  50. ==============
  51. P1
  52. It allows you to try the extension first, and if satisfied, you can
  53. decide to buy it for a fair price.
  54.  
  55. It allows me to get full control on the development and sales of this extension
  56. without deadlines and without seeing the fee disappear in someone elses
  57. pocket.
  58.  
  59.  
  60.  
  61. P3Main PowerBob commands.
  62. =======================
  63.  
  64. P4Reserve Pbobs
  65. P1
  66. Reserve Pbobs AMOUNT
  67.  Reserves a static memory list for AMOUNT of Pbobs.
  68.  You can reserve a list for a maximum of 64 Pbobs.
  69.  I can change this if you want more of them, but 64 seems to be
  70.  enough for most applications...
  71.  
  72.  Bytes reserved : AMOUNT * 8
  73.  
  74.  Type of memory : Chip or Fast if available.
  75.  
  76.  
  77. P4Pbob Erase
  78. P1
  79. Pbob Erase
  80.  Erase all Pbobs and their structure. This instruction is executed 
  81.  internally every time you run the AMOS/Pro program or when leaving 
  82.  AMOS/Pro.
  83.  
  84.  
  85. P4Pbob Dbuf
  86. P1
  87. Pbob Dbuf True/False
  88.  If you are going to use Pbobs with the double buffering system, set it
  89.  to True. Else set it to False.
  90.  This command MUST preceed all following commands !
  91.  
  92.  
  93. P4Pbob Height
  94. P1
  95. Pbob Height NR,MAXIMUM_HEIGHT
  96.  Reserves a PBOB_STRUCTURE for Pbob NR and initialises it with default
  97.  values.
  98.  If Pbob Dbuf is set to True, a second PBOB_STRUCTURE will be reserved
  99.  for use with the double buffering system.
  100.  
  101.  Bytes reserved : PBOB_STRUCTURE        Chip or Fast if available.
  102.           MAXIMUM_HEIGHT * 36     Chip
  103.           \--> 6 bytes for each line to save * 6 bitplanes.
  104.           (See Pbob instruction for more details)
  105.           If Pbob Dbuf is set to True, the amount of bytes reserved
  106.           is doubled.
  107.  
  108.  
  109. P4Pbob
  110. P1
  111. Pbob NR,X,Y,IMAGE
  112.  Does almost the same thing as the normal Bob command.
  113.  The only differences are :
  114.  1) the maximum width of the IMAGE is 32 pixels wide.
  115.     There are no restrictions on the height of the Pbob.
  116.  
  117.  2) the height of the IMAGE that will be displayed may NOT exceed
  118.     the maximum height for this Pbob.
  119.     See the Pbob Height command.
  120.  
  121.  3) the amount of colours of the IMAGE may NOT exceed the amount
  122.     of screen colours where the Pbob will be displayed.
  123.     Else a crash is certain!
  124.     So if you open a screen with 4 colours, do not try to display a Pbob
  125.     with 8 or more colours. But it is valid to, for example, to open a screen
  126.     with 32 colours and    display Pbob's with fewer colours (bitplanes).
  127.     Only the bitplanes defining the Pbob will be copied on screen.
  128.     
  129.  
  130.  4) all parameters must be included.
  131.  
  132.  5) the Pbob numbering starts at 1, not 0 like the AMOS/Pro Bobs...
  133.  
  134.  6) it is important to know that the coordinates for the Pbob's are
  135.     measured from the top left-hand corner of the image.
  136.     The current hot spot setting in not taken into account!
  137.  
  138.  7) the Pbob commands have to be executed in the screen where they are
  139.     to be displayed !
  140.     This is because a part of the Clipping routine is done inside the
  141.     Pbob command.
  142.     Ex.:
  143.     Repeat
  144.           Screen 1
  145.        Proc UPDATE_SCORE
  146.        Screen 0
  147.        Proc MOVE_BADDIES : Rem move the BAD_GUYS with Pbob NR,X,Y,IMAGE
  148.        Proc MOVE_GOODIE : Rem  move the GOOD_GUYS with Pbob NR,X,Y,IMAGE
  149.        Proc UPDATE_BADDIES_AND_GOODIES :Rem Pbob Clear
  150.            rem                                  Pbob Draw:Screen Swap : Wait Vbl
  151.     Until AMOUNT_OF_GOODIES=0
  152.  
  153. Pbob ARRAY_X,ARRAY_Y,ARRAY_IMAGE,START_BOB To END_BOB
  154.  This is a superfast replacement for the original Pbob command.
  155.  Normally you have to define all Pbob's whithin a loop like this :
  156.     
  157.   For I=START_BOB To END_BOB
  158.     Pbob I,ARRAY_X(I),ARRAY_Y(I),ARRAY_IMAGE(I)
  159.   Next I
  160.  
  161.  This loop can be replaced with one command !
  162.  
  163.   Pbob Varptr(ARRAY_X(N)),Varptr(ARRAY_Y(N)),Varptr(ARRAY_IMAGE(N)),START_BOB 
  164.                                                                    To END_BOB
  165.  
  166.  It looks very complicated and slow because of the use of the Varptr()
  167.  functions, but when compiled it is very effective and fast.
  168.  (I know this for sure, because I've examined the resulting compiled code...)
  169.  
  170.  Varptr(N) is only returning the adress where the N th element of the array
  171.  is stored in memory.  N doesn't have to be zero, you can start from any
  172.  element in the array, passing the values to the Pbob's.
  173.  It is also possible to use AMOS/Pro banks for storing the X/Y coordinates
  174.  and the Image of the Pbob's.
  175.  Beware, the X/Y and Image values stored in the banks have to be LONGWORDS
  176.  (32 bits).
  177.  
  178.  It has been carefully optimised to give the best speed possible!
  179.  A few tests, normally done by the usual Pbob command, have been
  180.  ommited.
  181.   1) It does not check if the Pbob IMAGE is wider than 32 pixels.
  182.   2) It does not check if the HEIGHT of the Pbob IMAGE exceeds the
  183.      maximum height for this Pbob.
  184.   3) Also the lenght of the ARRAY's or Banks are not checked for !
  185.  
  186.  So I advise you to test your program in the usual manner and, if 
  187.  everything works fine, you can use the new version of the Pbob
  188.  command.
  189.  
  190.  
  191. P4Pbob Off
  192. P1
  193. Pbob Off NR
  194.  Does the same thing as the Amos Bob Off NR command...
  195.  
  196. Pbob Off START To END
  197.  Discard a range of Pbobs.
  198.  
  199. Pbob Off
  200.  Does the same thing as the Amos Bob Off command...
  201.  
  202.  
  203. P4Set Pbob
  204. P1
  205. Set Pbob NR,REPLACE_MODE,PLANEMASK
  206.  Set Pbob drawing mode.
  207.  There are two types of REPLACE_MODE :
  208.    1) a value of 0 will save and restore the background under your Pbob,
  209.       this is the default value.
  210.    2) any other value will turn off the save and restore process.
  211.  
  212. The PLANEMASK is a bit-map, defining which plane(s) of the Pbob will be
  213.  copied onto the screen.
  214.  If a bit is set to zero, this particular plane of the Pbob will not
  215.  be copied onto the screen.
  216.  Ex.: Set Pbob 1,0,%100001  --> copy plane 6 and 1 onto the screen.
  217.           plane 654321
  218.  
  219.  
  220. P4Set Fastpbob Mode
  221. P1
  222. Set Fastpbob Mode True/False
  223.  This is a global swith, turning off the background saving/restoring process
  224.  for ALL Pbob's when set to True.
  225.  If set to False, every Pbob will be checked for, to see if the background
  226.  saving/restoring process has to be done.
  227.  By default, this switch is allways set to False.
  228.  
  229.  
  230. P4Pbob Update
  231. P1
  232. Pbob Update
  233.  Does the same thing as the Amos Bob Update command, except that
  234.  the Logical and Physical Screens are not swapped.
  235.  This allows a better control on the updating process if you are using
  236.  multiple double buffered screens.
  237.  
  238.  
  239. P4Pbob Clear 
  240. P1
  241. Pbob Clear START_BOB To END_BOB
  242.  Clear a range of Pbobs by restoring the original background.
  243.  
  244.  
  245. P4Pbob Draw 
  246. P1
  247. Pbob Draw START_BOB To END_BOB
  248.  Draw a range of Pbobs on screen.
  249.  
  250.  
  251. P4Pdraw 25fps
  252. P1
  253. Pdraw 25fps True/False
  254.  Set the Pbob Clear and Pbob Draw command in 25 frames per second
  255.  mode.
  256.  When you run your program, it is allways reset to 50 frames per second!
  257.  Beware, this mode does not influence the Pbob Update command!
  258.  
  259.  In ProjectX and Alien Breed and quite a lot of other games, the main
  260.  Sprite etc., is updated at 50 frames per second, but the Bobs are only
  261.  updated at 25 frames per second.
  262.  So the program looks like this:
  263.  
  264. DO 
  265. `
  266. A=1-A : rem a simple toggle 1st frame = 1, next frame =0  etc
  267. `
  268. `
  269. READ JOYSTICK AND STUFF EVERY FRAME
  270. `
  271. `
  272. If A=1
  273.    CLEAR ALL BOBS
  274. `
  275.    Pbob Clear 1 To 20
  276.  
  277.    CALCULATE NEW POSTIONS FOR BOBS 11 TO 20
  278. `
  279.    Pbob DRAW 11 TO 20 
  280.    ETC.......
  281. `
  282. Else
  283. `
  284.    CALCALCULATE NEW POSTIONS FOR BOBS 1 TO 10
  285. `
  286.    Pbob Draw 1 TO 10
  287.    ETC.....
  288. '
  289.    Screen Swap 
  290. '
  291. End If
  292. 'UPDATE MAIN SPRITE EVERY FRAME
  293. Sprite 0,X,Y,3
  294. Wait Vbl
  295. Loop
  296.  
  297. As you can see, Pbobs 11 to 20 are drawn in the first frame.
  298. The next frame, Pbobs 1 to 10 are drawn and screen swapped into view.
  299. But the joystick reading and anything else are updated every frame!
  300.  
  301.  
  302. P4Pswap Clear
  303. P1 In the old Pbob Clear command the background buffer adresses where
  304.  swapped inside the Pbob Clear command.
  305.  Normally you used to do :
  306.      Pbob Clear
  307.     Screen Swap
  308.     Pbob Clear
  309.  
  310.  The new way is :
  311.     Pbob Clear START_BOB To END_BOB
  312.     Screen Swap
  313.     Pswap Clear
  314.     Pbob Clear START_BOB To END_BOB
  315.  
  316.  
  317.  
  318. P3PowerBob functions.
  319. -------------------
  320. P1
  321. P4=I Pbob()
  322. P1
  323. IMAGE=I Pbob(NR)
  324.  Return the actual image for Pbob NR.
  325.  
  326.  
  327. P4=X Pbob()
  328. P1
  329. X=X Pbob(NR)
  330.  Return X coordinate of Pbob NR.
  331.  
  332.  
  333. P4=Y Pbob()
  334. P1
  335. Y=Pbob Y(NR)
  336.  Return Y coordinate of Pbob NR. 
  337.  
  338.  
  339.  
  340. P3Main PowerSprite commands.
  341. ==========================
  342. P4
  343. Set Psprite Colours
  344. P1
  345. Set Psprite Colours AMOUNT
  346.  Set the amount of colours for the Psprites.
  347.  This command MUST be executed before the Convert Sprites BNKNR command!
  348.  You can set it to 4 or 16 colours, but you have to be sure that all
  349.  Sprites in the bank to convert share the same amount of colours (bitplanes).
  350.  
  351.  
  352. P4Convert Sprites
  353. P1
  354. Convert Sprites BANKNR
  355.  Convert all Sprites in bank BANKNR to special hardware format.
  356.  As you know, Bob's and Sprites share the same format in memory.
  357.  Normally, when displaying a Sprite, it has to be converted into the
  358.  special hardware format (interleaved bitplane format), before it
  359.  can be displayed by the Sprite DMA-channels.
  360.  The Psprite commands skip this conversion giving an enormous speed-gain!
  361.  It is best to keep you Sprites and Bobs into separate banks, because
  362.  this command will convert all Bobs/Sprites in the bank, wasting a lot
  363.  of your precious memory !
  364.  At this moment the conversion works fine for 4 or 16 coloured Sprites
  365.  that are 16 pixels wide, any height is allowed.
  366.  When the conversion process is done, the original bank can be erased from
  367.  memory, because the converted images are stored in a different format 
  368.  and memory location.
  369.  You can even replace the converted bank by another one!
  370.  
  371.  
  372. P4Psprite Max
  373. P1
  374. Psprite Max AMOUNT
  375.  Set the maximum amount of Psprites that will be used.
  376.  A maximum of 128 Psprites is allowed !
  377.  By default it is set to 64, so Psprite 0 to 63 can be used.
  378.  
  379.  
  380. P4Psprite NR,X,Y,IMAGE
  381. P1 Does the same thing as the AMOS/Pro command.
  382.  All parameters must be given !
  383.  
  384.  
  385. P4Psprite ARRAY_X,ARRAY_Y,ARRAY_IMAGE,START_SPRITE To END_SPRITE
  386. P1 This is a superfast replacement for the original Psprite command.
  387.  Normally you have to define all Psprite's whithin a loop like this :
  388.     
  389.   For I=START_SPRITE To END_SPRITE
  390.     Psprite I,ARRAY_X(I),ARRAY_Y(I),ARRAY_IMAGE(I)
  391.   Next I
  392.  
  393.  This loop can be replaced with one command !
  394.  
  395.   Psprite Varptr(ARRAY_X(N)),Varptr(ARRAY_Y(N)),Varptr(ARRAY_IMAGE(N)),
  396.                                                 START_SPRITE To END_SPRITE
  397.  
  398.  It looks very complicated and slow because of the use of the Varptr()
  399.  functions, but when compiled it is very effective and fast.
  400.  (I know this for sure, because I've examined the resulting compiled code...)
  401.  
  402.  Varptr(N) is only returning the adress where the N th element of the array
  403.  is stored in memory.  N doesn't have to be zero, you can start from any
  404.  element in the array, passing the values to the Psprite's.
  405.  It is also possible to use AMOS/Pro banks for storing the X/Y coordinates
  406.  and the Image of the Psprite's.
  407.  Beware, the X/Y and Image values stored in the banks have to be LONGWORDS
  408.  (32 bits).
  409.  
  410.  It has been carefully optimised to give the best speed possible!
  411.  A few tests, normally done by the usual Psprite command, have been
  412.  ommited.
  413.   1) The lenght of the ARRAY's or Banks are not checked for !
  414.  
  415.  So I advise you to test your program in the usual manner and, if 
  416.  everything works fine, you can use the new version of the Psprite
  417.  command.
  418.  
  419.  
  420. P4Psprite Off
  421. P1
  422. Psprite Off NR
  423.  Does the same thing as the Amos/Pro Sprite Off NR command...
  424.  
  425. Psprite Off START To END
  426.  Discard a range of Psprites.
  427.  
  428. Psprite Off
  429.  Does the same thing as the Amos/Pro Sprite Off command...
  430.  
  431.  
  432. P4Psprite Update
  433. P1
  434. Psprite Update
  435.  This is a very powerfull updating command.
  436.  First it checks if the maximum amount of Psprites <= 8, if so
  437.  the Psprite images are copied directly to their corresponding
  438.  sprite DMA-channels.
  439.  
  440.  If the maximum amount of Psprites >8 and the number of actually
  441.  defined sprites with the Psprite command is <=8, the Psprite images
  442.  are copied directly to the sprite DMA-channels without sorting.
  443.  
  444.  In any other case the Psprites are first sorted on their Y-coordinates.
  445.  Then every Psprite is checked if it can be fitted in a particular
  446.  sprite DMA-channel.
  447.  It is possible to have 128 Psprites on screen using only 1 sprite 
  448.  DMA-channel!
  449.  
  450.  
  451.  
  452. P3PowerSprite functions.
  453. ----------------------
  454. P4
  455. =X Psprite()
  456. P1
  457. HARD_XCOOR=X Psprite(NR)
  458.  Returns the actual hardware X coordinate for Psprite NR
  459.  
  460.  
  461. P4=Y Psprite()
  462. P1
  463. HARD_YCOOR=Y Psprite(NR)
  464.  Returns the actual hardware Y coordinate for Psprite NR
  465.  
  466.  
  467.  
  468. P3Bob and Bob to Sprite collision detection.
  469. ==========================================
  470. P4
  471. =Pbob Fastcol()
  472. P1
  473. RESULT=Pbob Fastcol(PBOB,STARTPBOB To ENDPBOB)
  474.  Does the same thing as the Bob Col function except that I use
  475.  coordinate checking.
  476.  This method is much faster than using the BLITTER to check if a
  477.  collision has occured, but is not so accurate.
  478.  It can be used even if the BOB's have no mask.
  479.  
  480. RESULT=Pbob Fastcol(BOB To OTHER_BOB)
  481.  This one is handy if you want to detect a collision between two BOB's.
  482.  It does the same thing as Pbob Fastcol(PBOB,OTHER_PBOB To OTHER_PBOB) but
  483.  is a bit faster.
  484.  Since you are only checking for collision between one PBOB and another PBOB,
  485.  the flag in the collision array is not set.
  486.  This means that the Pfast Bobcol() function is useless in this case.
  487.   
  488.  
  489. P4=Pbobsprite Fastcol()
  490. P1
  491. RESULT=Pbobsprite Fastcol(PBOB,START_PSPRITE To END_PSPRITE)
  492.  Does the same thing as the Bobsprite Col function except that I use
  493.  coordinate checking.
  494.  This method is much faster than using the BLITTER to check if a
  495.  collision has occured, but is not so accurate.
  496.  It can be used even if the PBOB's and PSPRITE's have no mask.
  497.  
  498.  
  499. RESULT=Pbobsprite Fastcol(PBOB To PSPRITE)
  500.  This one is handy if you want to detect a collision between a PBOB and
  501.  one PSPRITE.
  502.  It does the same thing as Pbobsprite Fastcol(PBOB,PSPRITE To PSPRITE) but
  503.  is a bit faster.
  504.  Since you are only checking for collision between one PBOB and another PSPRITE,
  505.  the flag in the collision array is not set.
  506.  This means that the Pfast BobCol() function is useless in this case.
  507.  
  508.  
  509. P4=Pfast Bobcol()
  510. P1
  511. NR=Pfast Bobcol(BOB_NR)
  512.  Does the same thing as the Col(BOB_NR) function in AMOS/Pro.
  513.  But it only works when using Pbobs!
  514.  To be used when doing FAST collision detection.
  515.  
  516.  
  517. P4=Pfast Bobsprcol()
  518. P1
  519. NR=Pfast Bobsprcol(BOB_NR)
  520.  Does the same thing as the Col(SPRITE_NR) function in AMOS/Pro.
  521.  But it only works when using Pbobs and Psprites!
  522.  To be used when doing FAST collision detection.
  523.  
  524.  
  525.  
  526. P3Sprite and Sprite to Bob collision detection.
  527. =============================================
  528. P4
  529. =Psprite Fastcol()
  530. P1
  531. RESULT=Psprite Fastcol(PSPRITE,STARTPSPRITE To ENDPSPRITE)
  532.  Does the same thing as the Sprite Col function except that I use
  533.  coordinate checking.
  534.  This method is much faster than using the BLITTER to check if a
  535.  collision has occured, but is not so accurate.
  536.  It can be used even if the PSPRITE's have no mask.
  537.  
  538. RESULT=Psprite Fastcol(PSPRITE To OTHER_PSPRITE)
  539.  This one is handy if you want to detect a collision between two PSPRITE's.
  540.  It does the same thing as 
  541.  Psprite Fastcol(PSPRITE,OTHER_PSPRITE To OTHER_PSPRITE) but is a bit faster.
  542.  Since you are only checking for collision between one PSPRITE and another
  543.  PSPRITE, the flag in the collision array is not set.
  544.  This means that the Pfast Sprcol() function is useless in this case.
  545.  
  546.  
  547. P4=Pfast Sprcol()
  548. P1
  549. NR=Pfast Sprcol(PSPRITE_NR)
  550.  Does the same thing as the Col(SPRITE_NR) function in AMOS/Pro.
  551.  But it only works when using Psprites!
  552.  To be used when doing FAST collision detection.
  553.  
  554.  
  555. P4=Pspritebob Fastcol()
  556. P1
  557. RESULT=Pspritebob Fastcol(PSPRITE,STARTPBOB To ENDPBOB)
  558.  Does the same thing as the Spritebob Col function except that I use
  559.  coordinate checking.
  560.  This method is much faster than using the BLITTER to check if a
  561.  collision has occured, but is not so accurate.
  562.  It can be used even if the PSPRITE's/PBOB's have no mask.
  563.  
  564. RESULT=Pspritebob Fastcol(PSPRITE To PBOB)
  565.  This one is handy if you want to detect a collision between a PSPRITE and
  566.  one Pbob.
  567.  It does the same thing as 
  568.  Pspritebob Fastcol(PSPRITE,OTHER_PBOB To OTHER_PPBOB) but is a bit faster.
  569.  Since you are only checking for collision between one PSPRITE and a
  570.  PBOB, the flag in the collision array is not set.
  571.  This means that the Pfast Sprbobcol() function is useless in this case.
  572.  
  573.  
  574. P4=Pfast Sprbobcol()
  575. P1
  576. NR=Pfast Sprbobcol(PBOB_NR)
  577.  Does the same thing as the Col(BOB_NR) function in AMOS/Pro.
  578.  But it only works when using Psprites/Pbob's.
  579.  To be used when doing FAST collision detection.
  580.  
  581.  
  582. As you can see, there are four functions to examine FAST collisions between
  583. objects.
  584. I also use four collision detection arrays, one for each type of collision
  585. checking.
  586. It provides a method of keeping the collisions between different types of
  587. objects,Pbobs or Psprites, separated.
  588. This whas simply not possible with the AMOS/Pro original Col() function!
  589.  
  590.  
  591.  
  592. P3PowerBob Amal support.
  593. ======================
  594.  
  595. P4Pchannel To Pbob
  596. P1
  597. Pchannel To Pbob AMAL_CHANNEL To PBOB_NR
  598.  Assigns Pbob PBOB_NR to Channel AMAL_CHANNEL.
  599.  As normal with Amal programs, the X/Y and A variables define the
  600.  Pbob X/Y coordinates and it's image.
  601.  It is important to assign the channel(s) to the Pbob(s) after the
  602.  Amal CHAN_NR,ANIM$
  603.  Also the X/Y and A values must be declared within the Amal program!
  604.  This means that the Amal driven Pbob's don't require initial values.
  605.  These are transferred by the Psync Pbob command.
  606.  
  607.  
  608. P4Psync Pbob
  609. P1
  610. Psync Pbob START_BOB To END_BOB
  611.  It does the same thing as the Amos/Pro Synchro command, but as an
  612.  additional bonus a range of Pbobs can be updated, this is :
  613.  the new X/Y and A values are transferred to the Pbobs.
  614.  It whas also necessary to include a range to be compatible with the
  615.  new 25 frames per second mode.
  616.  You still have to call the Pbob Update or the Pbob Clear/Draw duo
  617.  to update your Pbobs on screen.
  618.  Beware ! The Psync Pbob command has to be executed in the screen 
  619.  where the Pbobs are to be displayed !
  620.  This is because a part of the Clipping routine is done inside the
  621.  Psync Pbob command.
  622.  
  623.  
  624. P4Psync Every Pbob
  625. P1
  626. Psync Every Pbob FRAME_COUNT
  627.  Normally the Psync Pbob transfers the X/Y and A values every time the
  628.  Psync Pbob command is called, this is the default mode.
  629.  In some occasions it is preferable to update these values at a slower
  630.  rate.  The FRAME_COUNT delay ranges from 1 to 32767.
  631.  
  632.  
  633.  
  634. P3PowerSprite Amal support.
  635. =========================
  636. P1
  637. P4Pchannel To Psprite
  638. P1
  639. Pchannel To Psprite AMAL_CHANNEL To PSPRITE_NR
  640.  Assigns Psprite PSPRITE_NR to Channel AMAL_CHANNEL.
  641.  As normal with Amal programs, the X/Y and A variables define the
  642.  Psprite X/Y coordinates and it's image.
  643.  It is important to assign the channel(s) to the Psprite(s) after the
  644.  Amal CHAN_NR,ANIM$
  645.  Also the X/Y and A values must be declared within the Amal program!
  646.  
  647.  
  648. P4Psync Psprite
  649. P1
  650. Psync Ppsprite START_SPRITE To END_SPRITE
  651.  It does the same thing as the Amos/Pro Synchro command for Sprites, but as an
  652.  additional bonus a range of Psprites can be updated, this is :
  653.  the new X/Y and A values are transferred to the Psprites.
  654.  You don't have to execute the Psprite Update command, because it is auto-
  655.  matically performed within the Psync Psprite command!
  656.  It whas necessary to include a range because you are limited to only 64
  657.  Amal channels that can control the Psprites with an Amal program.
  658.  But as you allready know, the Psprite system can display upto 128 Psprites
  659.  on a single screen.
  660.  What you can do is :
  661.   Set up 64 Amal channels that will control the first 64 Psprites in the usual
  662.   manner.
  663.   Then create a Procedure that will handle the rest of the Psprites in
  664.   normal AMOS/Pro code, using the Psprite NR,X,Y,IMAGE command.
  665.   Execute this Procedure BEFORE the Psync Psprite command and then call the
  666.   Psync Psprite command.
  667.     Ex.:    Proc _SET_UP_PSPRITE_AMAL_CHANNELS_0_TO_63
  668.         Proc _SET_UP_PSPRITES_64_TO_127_IN_AMOS/PRO_CODE
  669.         Repeat
  670.           Proc _GET_SOME_INPUT_FROM_THE_USER
  671.           Proc _CHANGE_COORDINATES_OF_PSPRITES_64_TO_127
  672.           Psync Psprite 0 To 63
  673.         Until BORED=True
  674.  
  675.  
  676. P4Psync Every Psprite
  677. P1
  678. Psync Every Psprite FRAME_COUNT
  679.  Normally the Psync Psprite transfers the X/Y and A values every time the
  680.  Psync Psprite command is called, this is the default mode.
  681.  In some occasions it is preferable to update these values at a slower
  682.  rate.  The FRAME_COUNT delay ranges from 1 to 32767.
  683.  
  684.  
  685.  
  686. P3Additional commands and functions.
  687. ==================================
  688. P1
  689. P4Psync Every
  690. P1
  691. Psync Every FRAME_COUNT
  692.  This command will synchronize the Pbob's and Psprite's at the same FRAME_COUNT.
  693.  But it is more effective to synchronise them at different FRAME_COUNTS,
  694.  if you are displaying lot's of Pbob's and Psprite's on screen.
  695.  Ex.: The main characters are Psprite's, so you want to display them as smooth
  696.       as possible, because your eyes are following them most of the time.
  697.       The other characters (the ennemies) are Pbob's that are only displayed to
  698.       kill them and are not followed constantly by your eyes.
  699.       You just aim at them and shoot.
  700.  But since the main characters are updated at 50 frames per second, the overall
  701.  gameplay will be very smooth.
  702.  
  703.  
  704. P4Set 68020 Amal
  705. P1
  706. Set 68020 Amal CHANNEL,AMAL$
  707.  When AMOS The Creator came out, most of the Amiga computers where equipped 
  708.  with the allready powerfull but limited MC68000 processor.
  709.  He could not have foreseen that many companies where going to design a wide
  710.  variety of accelerator boards and that later Amiga's would be equipped
  711.  with faster processors.
  712.  
  713.  F. Lionet, the author of the package, knew about these limitations and
  714.  decided that no more than 16 Amal programs should be run under interrupts
  715.  without a possible crash of the system.
  716.  
  717.  If you are the lucky owner of an accelerator board or a fast Amiga you
  718.  are now able to use all this power to execute even more Amal programs
  719.  under interrupts!
  720.  
  721.  The command format has not changed, but you are now able to run all
  722.  64 channels under interrupts.
  723.  So you don't have to use the Synchro Off command when setting up your
  724.  Amal programs!
  725.  
  726.  If you are one of those lucky guys, I advise you to make two versions
  727.  of your programs :
  728.   1) one that will run on a standard machine.
  729.   2) one designed for all those other faster Amiga's.
  730.  
  731.  
  732. Progams using 64 channels under interrupts will work on :
  733.  
  734.   standard A3000           68(EC)030   processor available. 
  735.   standard A1200           68EC020     processor available. 
  736.   standard A4000/30        68(EC)030   processor available. 
  737.   standard A4000/40        68(LC)040   processor available. 
  738.  
  739.   standard A500 and A500+  with 68(EC)020 or higher accelerator board.
  740.   standard A600            with 68(EC)020 or higher accelerator board.
  741.   standard A2000           with 68(EC)020 or higher accelerator board.
  742.   standard A1000           with 68(EC)020 or higher accelerator board.
  743.  
  744.   (EC) means : with or without MMU.
  745.   (LC) means : with or without FPU.
  746.  
  747. The could be working on : 
  748.  
  749.   standard A500 and A500+  with 68000 clocked at 14Mhz or higher with FASTRAM.
  750.   standard A600            with 68000 clocked at 14Mhz or higher with FASTRAM.
  751.   standard A2000           with 68000 clocked at 14Mhz or higher with FASTRAM.
  752.   standard A1000           with 68000 clocked at 14Mhz or higher with FASTRAM.
  753.  
  754.  
  755. P4=Xscr Sprite()
  756. P1
  757. XSCREEN_COORD=Xscr Sprite(NR)
  758.  This is a full replacement for XSCREEN_COORD=X Screen(X Sprite(NR)).
  759.  
  760.  
  761. P4=Yscr Sprite()
  762. P1
  763. YSCREEN_COORD=Yscr Sprite(NR)
  764.  This is a full replacement for YSCREEN_COORD=Y Screen(Y Sprite(NR)).
  765.  
  766.  
  767. P4=Xscr Mouse
  768. P1
  769. XSCREEN_COORD=Xscr Mouse
  770.  This is a full replacement for XSCREEN_COORD=X Screen(X Mouse).
  771.  
  772.  
  773. P4=Yscr Mouse
  774. P1
  775. YSCREEN_COORD=Yscr Mouse
  776.  This is a full replacement for YSCREEN_COORD=Y Screen(Y Mouse).
  777.  
  778.  
  779.  
  780. P3Array arithmetics.
  781. ------------------
  782. P1
  783. P4Pinc 
  784. P1
  785. Pinc ARRAY1,START_ELEMENT To END_ELEMENT
  786.  This is a superfast replacement for the original Inc command.
  787.  The values from an array can be incremented in one go!
  788.  Normally you have to increment all array elements whithin a loop like this:
  789.     
  790.   For I=START_ELEMENT To END_ELEMENT
  791.     Inc X(I)
  792.   Next I
  793.  
  794.  This loop can be replaced with one command !
  795.  
  796.   Pinc Varptr(X(0)),START_ELEMENT To END_ELEMENT
  797.  
  798.  It looks very complicated and slow because of the use of the Varptr()
  799.  functions, but when compiled it is very effective and fast.
  800.  
  801.  Varptr(0) is only returning the adress where element 0 (zero) of the array
  802.  is stored in memory.
  803.  Beware!  You MUST use Varptr(ARRAY(0)), START_ELEMENT and END_ELEMENT define
  804.  the range of the variables that will be incremented.
  805.  The only limitation is that only elements 0 through 16383 can be incremented.
  806.  It is also possible to use AMOS/Pro banks instead of array's. 
  807.  Beware! The values stored in the banks have to be LONGWORDS (32 bits).
  808.  
  809.  
  810. P4Set Pinc Range
  811. P1
  812. Set Pinc Range BOTTOM To TOP
  813.  This command sets the range for the Pinc command.
  814.  If you want to change for example the bottom value without changing the other
  815.  range, you can use the Same function.
  816.  Ex.: 1) Normal AMOS/Pro code.
  817.      Dim X(100)
  818.      For I=1 To 100
  819.          Add X(I),1,0 To 319
  820.      Next I
  821.  
  822.       2) PowerBob code.
  823.      Dim X(100),Y(100)
  824.      Set Pinc Range 0 To 319
  825.      Pinc Varptr(X(0)),1 To 100
  826.  
  827.  
  828. P4Unset Pinc Range 
  829. P1
  830. Unset Pinc Range
  831.  With this command you can discard the ranges that are used with the
  832.  Pinc command.
  833.  Ex.: Set Pinc Range 10 To 20
  834.       'Set a range when using Pinc.
  835.       Unset Pinc Range
  836.       'Unset the range when using Pinc.
  837.  Beware!
  838.  The Unset command does NOT clear the range values, they are only cleared
  839.  when doing a Default or Run.
  840.  
  841.  
  842. P4Pdec
  843. P1
  844. Pdec ARRAY1,START_ELEMENT To END_ELEMENT
  845.  This is a superfast replacement for the original Dec command.
  846.  The values from an array can be decremented in one go!
  847.  Look at the Pinc command for more information.
  848.  
  849.  
  850. P4Set Pdec Range
  851. P1
  852. Set Pdec Range BOTTOM1 To TOP1
  853.  This command sets the range for the Pdec command.
  854.  If you want to change for example the bottom value without changing the other
  855.  range, you can use the Same function.
  856.  Ex.: 1) Normal AMOS/Pro code.
  857.      Dim X(100)
  858.      For I=1 To 100
  859.          Add X(I),1,10 To 255
  860.      Next I
  861.  
  862.       2) PowerBob code.
  863.      Dim X(100)
  864.      Set Pdec Range 10 To 255
  865.      Pdec Varptr(X(0)),1 To 100
  866.  
  867.  
  868. P4Unset Pdec Range 
  869. P1
  870. Unset Pdec Range NR
  871.  With this command you can discard the ranges that are used with the
  872.  Pdec command.
  873.  
  874.  
  875. P4Padd
  876. P1
  877. Padd ARRAY1,VALUE1,START_ELEMENT To END_ELEMENT
  878.  This is a superfast replacement for the original Add command.
  879.  Beware!  You MUST use Varptr(ARRAY(0)), START_ELEMENT and END_ELEMENT define
  880.  the range of the variables that will be added with the correspondent values. 
  881.  Normally you have to add a value to all array elements whithin a loop 
  882.  like this:
  883.     
  884.   For I=START_ELEMENT To END_ELEMENT
  885.     Add X(I),VALUE1
  886.   Next I
  887.  
  888.  This loop can be replaced with one command !
  889.  
  890.   Padd Varptr(X(0)),VALUE1,START_ELEMENT To END_ELEMENT
  891.  
  892.  Beware!  You MUST use Varptr(ARRAY(0)), START_ELEMENT and END_ELEMENT define
  893.  the range of the variables that will be added with VALUE1
  894.  The only limitation is that only elements 0 through 16383 can be added.
  895.  It is also possible to use AMOS/Pro banks instead of array's. 
  896.  The values stored in the banks have to be LONGWORDS (32 bits).
  897.  
  898.  
  899. P4Set Padd Range
  900. P1
  901. Set Padd Range BOTTOM1 To TOP1
  902.  This command sets the range for the Padd command.
  903.  If you want to change for example the bottom value without changing the other
  904.  range, you can use the Same function.
  905.  Ex.: 1) Normal AMOS/Pro code.
  906.      Dim X(100),Y(100)
  907.      For I=1 To 100
  908.          Add X(I),10,0 To 319
  909.      Next I
  910.  
  911.       2) PowerBob code.
  912.      Dim X(100),Y(100)
  913.      Set Padd Range 0 To 319
  914.      Padd Varptr(X(0))10,1 To 100
  915.  
  916.  
  917. P4Unset Padd Range 
  918. P1
  919. Unset Padd Range NR
  920.  With this command you can discard the ranges that are used with the
  921.  Padd command.
  922.  
  923.  
  924. P4Psum
  925. P1
  926. Psum ARRAY1,ARRAY2,START_ELEMENT To END_ELEMENT
  927.  This is a superfast replacement for adding the values of ARRAY2 to ARRAY1.
  928.  Normally you have to add a two array's whithin a loop like this:
  929.     
  930.   For I=START_ELEMENT To END_ELEMENT
  931.     Add X(I),X_OFFSET(I)
  932.   Next I
  933.  
  934.  This loop can be replaced with one command !
  935.  
  936.   Psum Varptr(X(0)),Varptr(X_OFFSET(0)),START_ELEMENT To END_ELEMENT
  937.  
  938.  Beware!  You MUST use Varptr(ARRAY(0)), START_ELEMENT and END_ELEMENT define
  939.  the range of the variables that will be added to eachother.
  940.  The only limitation is that only elements 0 through 16383 can be summed.
  941.  It is also possible to use AMOS/Pro banks instead of array's. 
  942.  The values stored in the banks have to be LONGWORDS (32 bits).
  943.  
  944.  
  945. P4Set Psum Range
  946. P1
  947. Set Psum Range BOTTOM1 To TOP1
  948.  This command sets the range for the Psum command.
  949.  If you want to change for example the bottom value without changing the other
  950.  range, you can use the Same function.
  951.  
  952.  
  953. P4Unset Psum Range 
  954. P1
  955. Unset Psum Range NR
  956.  With this command you can discard the ranges that are used with the
  957.  Psum command.
  958.  
  959.  
  960. P4=Same
  961. P1
  962. =Same
  963.  Use of the Same function.
  964.  Set Pinc Range 0 To 100
  965.  Set Pinc Range Same To 300
  966.  This one will leave the bottom value for array 1 unchanged, but will 
  967.  initialise the TOP value to 300.
  968.  
  969.  
  970. P4Pmul
  971. P1
  972. Pmul ARRAY1,ARRAY2,START_ELEMENT To END_ELEMENT
  973.  This is a superfast replacement for multiplying the values in ARRAY1 with
  974.  ARRAY2.  The results are placed in ARRAY1.
  975.  
  976.  
  977. P4Pmul shift
  978. P1
  979. Pmul Shift RESULT,ARRAY,FACTOR,SHIFT,START_ELEMENT To END_ELEMENT
  980.  This command can be handy when doing some scaled arithmetic.
  981.  All values defined by START_ELEMENT to END_ELEMENT of ARRAY1 are multiplied by
  982.  FACTOR and shifted 2^SHIFT places to the right.  The results are placed in
  983.  array RESULT.
  984.  Ex.: Normal AMOS/Pro code.
  985.       Dim RESULT(100),ARRAY(100),FACTOR(360)
  986.       SHIFT=8
  987.       SCALED=2^8 : Rem 256
  988.       For I=0 To 360
  989.     FACTOR(I)=Cos(I)*SCALED
  990.       Next I
  991.       ANGLE=36
  992.  
  993.       For I=1 To 100
  994.     RESULT(I)=ARRAY(I)*FACTOR(ANGLE)/SCALED
  995.       Next I
  996.  
  997.       Enhanced PowerBobs code.
  998.       Pmul Shift Varptr(RESULT(0)),Varptr(ARRAY(0)),FACTOR(ANGLE),SHIFT,1 To 100
  999.  
  1000.  Beware! Make sure that the resulting array can hold the range of values
  1001.          defined by START_ELEMENT to END_ELEMENT.
  1002.  
  1003.  
  1004.  
  1005. P3Additional information.
  1006. =======================
  1007. P1
  1008. Since this extension is still growing and changing, I advise you to
  1009. save all your programs in ASCII format with separate graphic banks.
  1010. You are warned !!!
  1011.  
  1012.  
  1013. The Pbob Update command :
  1014.  The updating process is divided into 3 stages.
  1015.  1) Background replacement.
  1016.  
  1017.  2) Background saving.
  1018.     This is only done if the X/Y coordinates or the Pbob IMAGE width/height
  1019.     have changed since the last update.
  1020.  
  1021.  3) Image drawing.
  1022.     This is performed every time for all Pbob's.
  1023.  
  1024. The Pbob Clear command :
  1025.  The background is replaced every time for all Pbob's from their
  1026.  safe places.
  1027.  
  1028. The Pbob Draw command :
  1029.  The drawing process is divided into 2 stages.
  1030.  1) Define the area where the Pbob's will be displayed and
  1031.     copy this area to a safe place.
  1032.  2) Draw the images for all Pbob's.
  1033.  
  1034. So the Pbob Clear/Draw should be used when a lot of changes are done
  1035. onto the screen.
  1036.  Ex.:
  1037.     Do
  1038.        Pbob Clear START_BOB To END_BOB
  1039.        'do all other drawing stuff...
  1040.        Pbob Draw START_BOB To END_BOB
  1041.     Loop
  1042.